/**
 * 路径匹配器
 * @param {string} pattern
 * @param {string} path
 * @returns {Boolean}
 */
export function isPathMatch(pattern, path) {
  const regexPattern = pattern.replace(/\//g, '\\/').replace(/\*\*/g, '.*').replace(/\*/g, '[^\\/]*')
  const regex = new RegExp(`^${regexPattern}$`)
  return regex.test(path)
}

/**
 * 判断value字符串是否为空
 * @param {string} value
 * @returns {Boolean}
 */
export function isEmpty(value) {
  if (value == null || value == '' || value == undefined || value == 'undefined') {
    return true
  }
  return false
}

/**
 * 判断url是否是http或https
 * @param {string} url
 * @returns {Boolean}
 */
export function isHttp(url) {
  return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
}

/**
 * 判断path是否为外链
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
  return /^(https?:|mailto:|tel:)/.test(path)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUsername(str) {
  const valid_map = ['admin', 'editor']
  return valid_map.indexOf(str.trim()) >= 0
}

/**
 * @param {string} url
 * @returns {Boolean}
 */
export function validURL(url) {
  const reg =
    /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return reg.test(url)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validLowerCase(str) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUpperCase(str) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validAlphabets(str) {
  const reg = /^[A-Za-z]+$/
  return reg.test(str)
}

/**
 * @param {string} email
 * @returns {Boolean}
 */
export function validEmail(email) {
  const reg =
    /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  return reg.test(email)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function isString(str) {
  return typeof str === 'string' || str instanceof String
}

/**
 * @param {Array} arg
 * @returns {Boolean}
 */
export function isArray(arg) {
  if (typeof Array.isArray === 'undefined') {
    return Object.prototype.toString.call(arg) === '[object Array]'
  }
  return Array.isArray(arg)
}

/**
 * 格式化时间为 "YYYY年MM月DD日" 格式
 * @param {Date|string|number} [time] - 可选的时间值，可以是 Date 对象、时间戳（数字或字符串），默认为当前时间
 * @returns {string} 格式化后的日期字符串，如 "2025年06月04日"
 */
export function formatDateToCN(time = new Date()) {
  // 处理时间戳（字符串或数字类型）
  if (typeof time === 'string' || typeof time === 'number') {
    // 检查是否是秒级时间戳（10位数字）
    if (/^\d{10}$/.test(String(time))) {
      time = Number(time) * 1000 // 转换为毫秒
    }
    time = new Date(time)
  }

  // 验证时间是否有效
  if (isNaN(time.getTime())) {
    return '无效日期'
  }

  const year = time.getFullYear()
  const month = String(time.getMonth() + 1).padStart(2, '0') // 月份是0-11
  const date = String(time.getDate()).padStart(2, '0')

  return `${year}年${month}月${date}日`
}

/**
 * 将数字转换为千分位格式
 * @param {number|string} number - 需要格式化的数字
 * @param {number} [decimals=0] - 保留的小数位数
 * @param {string} [decimalSeparator='.'] - 小数点分隔符
 * @param {string} [thousandsSeparator=','] - 千分位分隔符
 * @returns {string} 格式化后的字符串
 */
export function formatNumber(number, decimals = 0, decimalSeparator = '.', thousandsSeparator = ',') {
  // 处理非数字值
  if (isNaN(parseFloat(number)) || !isFinite(number)) return ''

  // 转换为数字并保留指定小数位数
  const numericValue = Number(number)
  const fixedValue = numericValue.toFixed(decimals)

  // 分割整数和小数部分
  const parts = fixedValue.split('.')
  let integerPart = parts[0]
  const decimalPart = parts.length > 1 ? decimalSeparator + parts[1] : ''

  // 添加千分位分隔符
  const regex = /(\d+)(\d{3})/
  while (regex.test(integerPart)) {
    integerPart = integerPart.replace(regex, `$1${thousandsSeparator}$2`)
  }

  return integerPart + decimalPart
}
